package vargapeter.bet.client;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import vargapeter.bet.BookmakerRemote;

/**
 * A sportfogadók kezelését és a fájlból beolvasásukat megvalósító osztály.
 */
public class SportEventManager extends Manager {
	private List<SportEvent> events = new ArrayList<SportEvent>();

	/**
	 * létrehozza az eseményeket és megkeresi a fogadóirodákat a paramétereken megadott portokon. 
	 * @param bookmakers
	 * @throws IOException
	 */
	public SportEventManager(List<Integer> bookmakers) throws IOException {
		super(bookmakers);
		initEvents();
	}

	/**
	 * Beolvassa az eseményeket egy fájlból és hozzáadja őket egy listához.
	 * @throws IOException
	 */
	private void initEvents() throws IOException {
		Scanner sc = new Scanner(getClass().getResourceAsStream("/sportesemenyek.txt"));
		sc.useDelimiter("\t");
		while (sc.hasNext()) {
			SportEvent sportEvent = new SportEvent(sc.next().trim(), sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt());
			events.add(sportEvent);
		}
	}
	
	/**
	 * Ez az osztály kezeli az események műveleteit.
	 */
	private class SportEventHandler implements Runnable {
		private SportEvent sportEvent;

		public SportEventHandler(SportEvent sportEvent) {
			this.sportEvent = sportEvent;
		}

		public void run() {
			try {
				boolean running = true;
				int currentTime = 0;
				while (running) {
					/* Üzenünk az irodáknak, ha új esemény jelenik meg */
					if (sportEvent.isStarting(currentTime)) {
						for (BookmakerRemote bookmaker : bookmakerServers) {
							/* az események a torzított oddsokat küldik tovább a fogadóirodának */
							bookmaker.eventReleased(sportEvent.getEventName(), sportEvent.getDistortedHome(), sportEvent.getDistortedAway(), sportEvent.getDistortedDraw());
						}
					}
					
					/* Üzenünk az irodáknak, ha az esemény végetért */
					if (sportEvent.isEnded(currentTime)) {
						for (BookmakerRemote bookmaker : bookmakerServers) {
							bookmaker.eventEnded(sportEvent.getEventName(), sportEvent.getOutcome());
							/* ha az esemény végetért nincs több dolga, kiléphetünk a szálból */
							running = false;
						}
					}
					Thread.sleep(1);
					currentTime++;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * Minden esemény kezelését külön szálon indítja el.
	 */
	public void init() {
		for (SportEvent sportEvent : events) {
			new Thread(new SportEventHandler(sportEvent)).start();
		}		
	}
}
